package main

import (
	"fmt"
	"sync"
)

// 定义一个变量
var k int

var wg = sync.WaitGroup{}

func add() {

	for i := 0; i < 100000; i++ {
		k = k + 1

	}
	defer wg.Done()
}
func sub() {

	for i := 0; i < 100000; i++ {
		k = k - 1

	}
	defer wg.Done()
}

// 多个协程操作同一个变量
func main() {
	wg.Add(1)
	go add() //启动协程
	wg.Add(1)
	go sub()
	wg.Wait()
	//这个语句一定要在wg.wait()之后输出，否则会认为只是简单的main里的一个逻辑
	fmt.Println(k) //结果在理论上应该是0，无论怎么交替执行，最终想象的结果应该为0，但是事实上不是0
	//问题出现的原因：交替执行并不是以一个方法为整体交替的，而是不同方法内的语句交替执行，也就是说会出现争抢资源的现象
	//要解决这个问题可以用锁的机制=》一个协程在执行逻辑的时候另外一个协程不执行
}
